package com.example.stukotlin.advancedFunction

import java.lang.StringBuilder

/**
 * 高阶函数
 * 内联函数
 */
fun main() {
    val numAndNum = num1AndNum2(10, 18, ::minus)
    val numAndNum1 = num1AndNum2(10, 18, ::plus)
    println(numAndNum)
    println(numAndNum1)
    //lambda方式调用高阶函数
    val num1 = 100
    val num2 = 76
    val num1AndNum2 = num1AndNum2(num1, num2) { num1, num2 ->
        num1 + num2
    }
    println(num1AndNum2)

    //常规写法
    val builder = StringBuilder()
    builder.append("1")
    builder.append("2")
    //apply 函数
    builder.apply {
        append("3")
        append("4")
    }
    //apply实现方式
}

/**
 * 扩展函数 build 函数类型前面加上ClassName.表示函数类型定义在哪个类中，lambda自动会拥有类的上下文
 */
fun StringBuilder.build(block: StringBuilder.() -> Unit): StringBuilder {
    block()
    return this
}

/**
 * 内联函数 扩展函数 build2
 */
inline fun StringBuilder.build(block: () -> Unit): StringBuilder {
    block()
    return this
}

/**
 * 高阶函数测试
 */
fun num1AndNum2(num1: Int, num2: Int, operation: (Int, Int) -> Int): Int {
    return operation(num1, num2)
}

/**
 * 高阶函数
 */
fun example(func: (String, Int) -> Unit) {
    func("hello", 124)
}

fun plus(num1: Int, num2: Int): Int {
    return num1 + num2
}

fun minus(num1: Int, num2: Int): Int {
    return num1 - num2
}
